//用循环队列解决舞伴问题。
/*
问题描述: 假设在周末舞会上，男士们和女士们进入舞厅时各自排成一队，跳舞开始时，
依次从男队和女队的队头上各出一人配成舞伴，若两队初始人数不相同，则较长的那一队中未配对者等待下一轮舞曲,跳完舞的人，
按原来的次序依次重新回到原来的队列的末尾。现要求设计一个函数模拟上述舞伴配对问题，试设计程序实现之。假设有5位女生，8位男生，
那么前三支舞曲的配对情况应该如下所示:
男女生数量m和n都应该用变量表示，要求实验打印并输出前K(K>=1)支舞曲的配对情况
*/

#include<iostream>
#include <queue>
#include<string> 

//创建队列对象
//格式：std::queue<数据类型> 对象名;

std::queue<std::string> create_queue(int n, int sex){
     std::queue<std::string> q;
     for(int i=0; i< n;i++){
         q.push((sex==1?"Boy":"Girl")+ std::to_string(i+1));

         std::cout << (sex==1?"Boy":"Girl") << i + 1 <<  std::endl;
     }
     return q;
}

//取队列队首元素，删除队首元素，然后再将元素重新加入队列
std::string get_first_item(std::queue<std::string> &q){
    //取队首元素
    std::string ele = q.front();
          
    //删除队首元素
    q.pop();

    //再将队首元素重新加入队列
    q.push(ele);

    return ele;
}

// boy_queue：男生队列
// girl_queue:女生队列
void printDanceBoyGirl(std::queue<std::string> &boy_queue, std::queue<std::string> &girl_queue){
      //1、取两队列最小大小
      int m = boy_queue.size();
      int n = girl_queue.size();
      int size = m>n ? n : m;

      //2、根据最小大小遍历
      std::string boy,girl;
      for(int i=0;i <size;i++){
        boy = get_first_item(boy_queue);
        girl= get_first_item(girl_queue);
          
        std::cout << "女生：" << girl << " - 男生：" << boy  << std::endl;
      }
}

// m:男生数量
// n:女生数量
// k:舞曲数量
void loop_dance(int m, int n, int k){
    //实现步骤：

    //1、创建男女队列
    std::queue<std::string> boy_queue = create_queue(m,1);
    std::queue<std::string> girl_queue = create_queue(n,2);

    //2、根据舞曲数量遍历
    for(int i=0; i<k;i++){
        std::cout << "第" << i + 1 <<  "支舞曲配对如下：" << std::endl;
        printDanceBoyGirl(boy_queue,girl_queue);
    }
}

int main() {
    loop_dance(8, 5, 3);

    return 0;
}